package photosalvage.util;

import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;

public class ImageUtils {
	
	public static BufferedImage scale(BufferedImage inputImage, int width, int height) {
		// 現在のイメージのサイズ
		int currentWidth = inputImage.getWidth();
		int currentHeight = inputImage.getHeight();

		// 現在のイメージ
		BufferedImage currentImage = inputImage;

		// 最終的なサイズと現在のイメージの差
		int delta = currentWidth - width;
		// 次に縮小するサイズ
		int nextPow2 = currentWidth >> 1;

		while (currentWidth > 1) {
			// 最終的なイメージとサイズの差が、次に縮小するサイズよりも
			// 小さいかどうか調べる
			if (delta <= nextPow2) {
				// イメージのサイズの差が小さい場合
				if (currentWidth != width) {
					// 最終的な縮小率が 1/2n にならない場合
					BufferedImage tmpImage = new BufferedImage(width,
							height, BufferedImage.TYPE_INT_RGB);
					Graphics2D g = (Graphics2D) tmpImage.getGraphics();
					g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
							RenderingHints.VALUE_INTERPOLATION_BILINEAR);
					g.drawImage(currentImage, 0, 0, tmpImage.getWidth(),
							tmpImage.getHeight(), null);
					g.dispose();

					currentImage = tmpImage;
				}
				return currentImage;
			} else {
				// イメージのサイズの差が大きい場合
				// 更に半分に縮小する
				BufferedImage tmpImage = new BufferedImage(currentWidth >> 1,
						currentHeight >> 1, BufferedImage.TYPE_INT_RGB);
				Graphics2D g = (Graphics2D) tmpImage.getGraphics();
				g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
						RenderingHints.VALUE_INTERPOLATION_BILINEAR);
				g.drawImage(currentImage, 0, 0, tmpImage.getWidth(),
						tmpImage.getHeight(), null);
				g.dispose();

				// 変数の更新
				currentImage = tmpImage;
				currentWidth = currentImage.getWidth();
				currentHeight = currentImage.getHeight();
				delta = currentWidth - width;
				nextPow2 = currentWidth >> 1;
			}
		}
		return currentImage;
	}
	/**
	 * http://www.javainthebox.com/2010/07/java-3.html
	 * @param inputImage
	 * @param scaleFactor
	 * @return
	 */
	public static BufferedImage scale(
			BufferedImage inputImage, double scaleFactor) {
		// 現在のイメージのサイズ
		int currentWidth = inputImage.getWidth();
		int currentHeight = inputImage.getHeight();

		// 最終的なイメージのサイズ
		int width = (int) (currentWidth * scaleFactor);
		int height = (int) (currentHeight * scaleFactor);
		return scale(inputImage, width, height);
	}
}
